package com.hzz.web.boss.user;


import com.hzz.api.user.IUserService;
import com.hzz.dto.user.UserDto;
import com.hzz.framework.PageUtil;
import com.hzz.framework.Response;
import com.hzz.framework.annotation.ALogOperation;
import com.hzz.framework.annotation.RfUser2Bean;
import com.hzz.framework.annotation.auth.Logical;
import com.hzz.framework.annotation.auth.RequiresPermissions;
import com.hzz.framework.config.EncryptConfig;
import com.hzz.framework.security.CryptoJSDES;
import com.hzz.framework.security.MD5;
import com.hzz.framework.util.CommonConstant;
import com.hzz.framework.util.ValidatorUtil;
import com.hzz.framework.web.controller.BaseController;
import io.swagger.annotations.Api;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.BindingResult;
import org.springframework.validation.ObjectError;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@Api(description = "组织体系-河长信息")
@RestController
@Slf4j
public class RiverSupervisorController extends BaseController {
    @Autowired
    EncryptConfig encryptConfig;
    @Autowired
    IUserService userService;
    static final String acPrefix = "/boss/staff/riverSupervisor/";

    @RequiresPermissions("riverSupervisor:menu")
    @RequestMapping(method = {RequestMethod.GET, RequestMethod.POST}, value = acPrefix + "page/{pageNum}")
    // @ApiOperation(value = "信息分页(未删除)")
    public Response page(@ModelAttribute UserDto dto, @PathVariable("pageNum") Integer pageNum) {
        log.info("page.........");
        Response result = new Response();
        try {
            dto.setPageSize(CommonConstant.PAGEROW_DEFAULT_COUNT);
            dto.setPageNum(pageNum);
            dto.setDelFlag(0);
            dto.setTypes(CommonConstant.TYPES_各河长);
            result.data = PageUtil.copy(userService.findDataIsPage(dto));
        } catch (Exception e) {
            result = Response.error(e.getMessage());
        }
        return result;
    }

    @RequiresPermissions("riverSupervisor:info")
    @RequestMapping(method = {RequestMethod.GET, RequestMethod.POST}, value = acPrefix + "info/{id}")
    // @ApiOperation(value = "信息详情")
    public Response info(@PathVariable("id") Long id) {
        log.info("info.........");
        Response result = new Response();
        try {
            UserDto dto = new UserDto();
            dto.setId(id);
            dto.setDelFlag(0);
            dto.setTypes(CommonConstant.TYPES_各河长);
            result.data = userService.findDataById(dto);
        } catch (Exception e) {
            result = Response.error(e.getMessage());
        }
        return result;
    }

    @RequiresPermissions("riverSupervisor:del")
    @RequestMapping(method = RequestMethod.POST, value = acPrefix + "del/{id}")
    @ALogOperation(type = "删除", desc = "组织体系-河长信息-逻辑删除")
    // @ApiOperation(value = "逻辑删除")
    public Response del(@PathVariable("id") Long id) {
        log.info("del.........");
        Response result = new Response(0, "success");
        try {
            UserDto dto = new UserDto();
            dto.setId(id);
            dto.setTypes(CommonConstant.TYPES_各河长);
            result.message = userService.deleteDataById(dto);
        } catch (Exception e) {
            result = Response.error(e.getMessage());
        }
        return result;
    }

    @RequiresPermissions(value = {"riverSupervisor:add", "riverSupervisor:edit"}, logical = Logical.OR)
    @RequestMapping(method = {RequestMethod.POST, RequestMethod.PUT}, value = acPrefix + "save")
    @RfUser2Bean
    @ALogOperation(type = "修改", desc = "组织体系-河长信息")
    // @ApiOperation(value = "信息保存")
    public Response save(@Validated @ModelAttribute UserDto dto, BindingResult bindingResult) {
        log.info("save.........");
        Response result = new Response(0, "success");
        try {
            //if ("1".equals(request.getSession().getAttribute(acPrefix + "save." + dto.getToken()))) {
            //    throw new RuntimeException("请不要重复提交!");
            //}
            if (bindingResult.hasErrors()) {
                String errorMsg = "";
                List<ObjectError> errorList = bindingResult.getAllErrors();
                for (ObjectError error : errorList) {
                    errorMsg += (error.getDefaultMessage()) + ";";
                }
                result = Response.error(errorMsg);
            } else {
                if (CommonConstant.TYPES_各河长.indexOf(dto.getType()) == -1) {
                    return Response.error("河长类型错误!");
                }
                // password: that.encrypt(encrypt.key, CryptoJS.MD5(that.password).toString()),
                if (ValidatorUtil.notEmpty(dto.getPassword())) {
                    dto.setPassword(CryptoJSDES.desDecrypt(dto.getPassword(), MD5.md5Hex(encryptConfig.getPRIKEY())));
                }
                // confirmPassword: that.encrypt(encrypt.key, CryptoJS.MD5(that.confirmPassword).toString()),
                if (ValidatorUtil.notEmpty(dto.getConfirmPassword())) {
                    dto.setConfirmPassword(CryptoJSDES.desDecrypt(dto.getConfirmPassword(), MD5.md5Hex(encryptConfig.getPRIKEY())));
                }
                result = userService.saveOrUpdateData(dto);
                //request.getSession().setAttribute(acPrefix + "save." + dto.getToken(), "1");
            }
        } catch (Exception e) {
            result = Response.error(e.getMessage());
        }
        return result;
    }

    /**
     * 所有河长信息，用于其他功能选择
     *
     * @param dto
     * @return
     */
    @RequestMapping(method = RequestMethod.GET, value = acPrefix + "list")
    // @ApiOperation(value = "信息详情")
    public Response<List<UserDto>> list(UserDto dto) {
        log.info("list.........");
        Response<List<UserDto>> result = new Response<>();
        try {
            dto.setTypes(CommonConstant.TYPES_各河长);
            result.data = userService.findDataIsList(dto);
        } catch (Exception e) {
            result = Response.error(e.getMessage());
        }
        return result;
    }
}
